package com.example.module.goods.service.impl;


import com.example.common.unit.GetUserInfoBySessionUnit;
import com.example.config.MinioConfig;
import com.example.module.goods.service.GoodsImagesService;
import com.example.module.goods.service.GoodsService;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

/**
 * @author ghy
 * @date 2025/09/18
 * @description 商品图片相关实现类
 */
@Service
public class GoodsImagesImpl implements GoodsImagesService {
    @Resource
    private MinioConfig minioConfig;
    @Resource
    private MinioClient minioClient;
    @Resource
    private GoodsService goodsService;

    /*
     * 上传图片至minio
     *
     * @param file              上传的图片文件
     * @return fileUrl          图片URL
     * */
    @Override
    public String uploadFile(MultipartFile file) {
        try {
            // 获取用户手机号
            String userPhone = GetUserInfoBySessionUnit.getUserPhone();

            // 检查goods-images主桶是否存在，不存在则创建
            boolean bucketExists = minioClient.bucketExists(
                    BucketExistsArgs.builder().bucket("goods-images").build());
            if (!bucketExists) {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket("goods-images").build());
            }

            // 生成唯一文件名称
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null || originalFilename.lastIndexOf(".") == -1) {
                throw new RuntimeException("文件格式错误");
            }

            String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            String randomFileName = UUID.randomUUID().toString();
            // 文件名称
            String objectName = userPhone + "/" + randomFileName + "." + fileExtension;

            // 上传文件
            minioClient.putObject(
                    PutObjectArgs.builder()
                            // 存储桶名称
                            .bucket("goods-images")
                            // 文件名称（包含目录结构）
                            .object(objectName)
                            // 文件流，文件大小，每次读取上传大小
                            .stream(file.getInputStream(), file.getSize(), -1)
                            // 文件类型
                            .contentType(file.getContentType())
                            //构建
                            .build()
            );

            // 生成可访问的文件地址
            String fileUrl = "http://localhost:9000" + "/" + "goods-images" + "/" + objectName;

            return fileUrl;
        } catch (Exception e) {
            throw new RuntimeException("图片上传失败");
        }
    }



}
